home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs53.d81 / 28may87s.pma / CXRAMDSK.ASM < prev    next >
Assembly Source File  |  1979-12-31  |  5KB  |  247 lines

  1. ;
  2. ;
  3.     title    'C128 Ram Disk support  14 Oct 85'
  4.  
  5.  
  6. ;    maclib    cpm3
  7.  
  8.     maclib    z80
  9.  
  10.     maclib    cxequ
  11.  
  12.  
  13.  
  14. ; Utility routines in standard BIOS
  15.     extrn    ?pmsg        ; print message @<HL> up to 00
  16.                 ; saves <BC> & <DE>
  17.     extrn    ?pdec        ; print binary number in <A> from 0 to 99.
  18.     extrn    ?pderr        ; print BIOS disk error header
  19.     extrn    ?conin,?cono    ; con in and out
  20.     extrn    ?const        ; get console status
  21.     extrn    @dtbl        ; DMA ram bank
  22.  
  23.     public    RMdsk
  24.  
  25.     extrn    ?fun65
  26.     extrn    ?dkmov
  27.  
  28.     page
  29. ;
  30.     CSEG        ; place code in common memory
  31.  
  32. ;
  33. ; Extended Disk Parameter Headers (XPDHs)
  34. ;
  35.     dw    RM$write
  36.     dw    RM$read
  37.     dw    RM$login
  38.     dw    RM$init
  39.     db    0        ; relative drive zero
  40.     db    0        ; format type byte
  41. RMdsk:        ;    dph    0,dpb$RM$512
  42.     dw    0            ; TRANSLATE TABLE ADDRESS
  43.     db    0,0,0,0,0,0,0,0,0    ; BDOS SCRATCH AREA
  44.          db    0            ; MEDIA FLAG
  45. DPB$ptr:
  46.     dw    dpb$RM$512        ; DISK PARAMETER BLOCK
  47.     dw    00000h            ; CHECKSUM VECTOR ALLOCATED BY
  48.     dw    0FFFEh            ; ALLOC VECTOR ALLOCATED BY GENCPM
  49.     dw    0FFFEh            ; DIRBCB
  50.     dw    0FFFEh            ; DTABCB
  51.     dw    0FFFEh            ; HASH ALLOC'D
  52.     db    0            ; HASH BANK
  53.  
  54.  
  55.                 ;
  56.                 ; DPB FOR RAM disk
  57.                 ;
  58.  
  59. dpb$RM$128:    ;    dpb    256,1,512,1024,64,0
  60.     DW    0002        ; 128 BYTE RECORDS PER TRACK
  61.     DB    03,07        ; BLOCK SHIFT AND MASK
  62.     DB    00        ; EXTENT MASK
  63.     DW    007Fh        ; MAXIMUM BLOCK NUMBER
  64.     DW    003Fh        ; MAXIMUM DIRECTORY ENTRY NUMBER
  65.     DB    0C0h,00h    ; ALLOC VECTOR FOR DIRECTORY
  66.     DW    8000h        ; CHECKSUM SIZE
  67.     DW    0        ; OFFSET FOR SYSTEM TRACKS
  68.     DB    1,1        ; PHYSICAL SECTOR SIZE SHIFT
  69.  
  70. dpb$RM$512:    ;    dpb    256,1,2048,2048,128,0
  71.     DW    0002        ; 128 BYTE RECORDS PER TRACK
  72.     DB    04,0Fh        ; BLOCK SHIFT AND MASK
  73.     DB    01        ; EXTENT MASK
  74.     DW    00FFh        ; MAXIMUM BLOCK NUMBER
  75.     DW    007Fh        ; MAXIMUM DIRECTORY ENTRY NUMBER
  76.     DB    0C0h,00h    ; ALLOC VECTOR FOR DIRECTORY
  77.     DW    8000h        ; CHECKSUM SIZE
  78.     DW    0        ; OFFSET FOR SYSTEM TRACKS
  79.     DB    1,1        ; PHYSICAL SECTOR SIZE SHIFT
  80.  
  81.     page
  82. ;
  83. ;
  84. ;
  85.     dseg
  86. RM$write:
  87.     mvi    d,VIC$RM$wr
  88.     lda    @dbnk        ; get disk bank
  89.     ana    a
  90.     lhld    @dma
  91.     jrz    RM$do$rd$wr
  92.     call    ?dkmov+3    ; A<>0 transfers data from local$DMA to buffer
  93.     mvi    d,VIC$RM$wr
  94.     jr    RM$do$rd$wr$buf
  95. ;
  96. ;
  97. ;
  98. RM$read:
  99.     mvi    d,VIC$RM$rd
  100.     lda    @dbnk        ; get disk bank
  101.     ana    a        ; is it bank zero
  102.     lhld    @dma
  103.     jrz    RM$do$rd$wr    ; yes, go read it
  104.  
  105.     call    RM$do$rd$wr$buf    ; no,  transfer through buffer
  106.     lhld    @dma
  107.     call    ?dkmov+3    ; A=0 transfers data from buffer to local$DMA
  108.     xra    a
  109.     ret
  110. ;
  111. ;
  112. ;
  113. RM$do$rd$wr$buf:
  114.     lxi    h,@buffer
  115. RM$do$rd$wr:
  116.     lxi    b,RM$128$low
  117.     outp    l
  118.     inr    c        ; RM$128$mid
  119.     outp    h
  120.     inr    c        ; RM$ext$low
  121.     xra    a
  122.     outp    a
  123.     lhld    @trk
  124.     inr    c        ; RM$ext$mid
  125.     outp    l
  126.     inr    c        ; RM$ext$hi
  127.     outp    h
  128.     lxi    h,256
  129.     inr    c        ; RM$count$low
  130.     outp    l
  131.     inr    c        ; RM$count$hi
  132.     outp    h
  133.     mov    a,d        ; get rd/wr command
  134.     call    ?fun65
  135.     xra    a        ; set no errors
  136.     ret
  137.  
  138.     page
  139. ;
  140. ;
  141. ;
  142.     dseg
  143. RM$init:
  144.     lxi    b,RM$control
  145.     xra    a
  146.     outp    a            ; increment both addresses
  147.     dcr    c            ; point to interrupt control register
  148.     outp    a            ; disable interrupts
  149.  
  150.     lxi    h,0            ; point to track 0
  151.     shld    @trk
  152.     xra    a
  153.     sta    @dbnk            ; set DMA bank to zero
  154.     lxi    h,@buffer        ; 
  155.     shld    @dma
  156.  
  157. test$device$present:
  158.     mov    m,l            ; place a pattern in the directory
  159.     inr    l            ; ..buffer area
  160.     jrnz    test$device$present    ; 
  161.  
  162.     call    RM$read            ; read track 0 to DMA buffer
  163.     lxi    h,@buffer        ; ..(buffer not changed if
  164.     lxi    d,dir$label        ; ..device is not present)
  165.     lxi    b,12            ; test if KEY has been installed
  166. test$next$key:
  167.     ldax    d
  168.     inx    d
  169.     cci
  170.     jrnz    no$match        ; KEY missing, test device present
  171.     jpe    test$next$key
  172.     jr    set$size        ; KEY is in RAM DISK, go set size
  173.  
  174.     page
  175. ;
  176. ;    test if device is present, remove vector if not
  177. ;
  178. no$match:
  179.     mvi    l,0            ; start back at the buffer beginning
  180. test$for$ram$dsk:
  181.     mov    a,m
  182.     cmp    l            ; buffer changed?
  183.     jrnz    device$is$present    ; yes, then device is present
  184.     inr    l            ; no, buffer end?
  185.     jrnz    test$for$ram$dsk    ; no, test rest of buffer
  186.                     ; yes, L=0
  187. ;
  188. ;    device is missing, remove vector
  189. ;
  190.     mov    h,l            ; remove vector to RAM disk
  191.     shld    @dtbl+('M'-'A')*2    ; .. (drive M:)
  192.     ret
  193. ;
  194. ;    initialize directory buffer
  195. ;
  196. device$is$present:
  197.     call    init$buffer        ; fill buffer with E5`s
  198.     lxi    h,dir$label
  199.     lxi    d,@buffer
  200.     lxi    b,32
  201.     ldir                ; install directory label in 1st record
  202.     lxi    h,0
  203.     shld    @trk            ; set track=0
  204.  
  205. clear$dir:
  206.     call    RM$write        ; erase director sectors
  207.     call    init$buffer        ; fill buffer with E5`s
  208.     lda    @trk
  209.     inr    a
  210.     sta    @trk
  211.     cpi    16            ; 16 for 512K Ram disk
  212.     jrnz    clear$dir
  213.  
  214. set$size:
  215.     lxi    h,dpb$RM$128
  216.     lxi    b,RM$status
  217.     inp    a
  218.     ani    10h            ; mask of size bit (0=128K)
  219.     jrz    set$128K
  220.     lxi    h,dpb$RM$512
  221. set$128K:
  222.     shld    dpb$ptr    
  223. RM$login:
  224.     ret
  225.  
  226.     page
  227. ;
  228. ;
  229. ;
  230. init$buffer:
  231.     lxi    h,@buffer
  232.     mvi    m,0E5h
  233.     lxi    d,@buffer+1
  234.     lxi    b,256-1
  235.     ldir
  236.     ret
  237.  
  238. ;
  239. ;
  240. ;
  241. dir$label:    ;123456789012  3 4 5 6
  242.     db    ' ERTWINE VON',1,0,0,0
  243.     dw    0,0,0,0
  244.     dw    date$hex,0
  245.     dw    date$hex,0
  246.  
  247.